package com.wnx.job.modules.jms.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wnx.job.common.api.Const;
import com.wnx.job.common.api.PageResult;
import com.wnx.job.common.api.QueryPageBean;
import com.wnx.job.common.api.ResultData;
import com.wnx.job.common.mapstruct.CompanyMapper;
import com.wnx.job.component.AsyncTask;
import com.wnx.job.modules.jms.dto.CompanyInfoParam;
import com.wnx.job.modules.jms.dto.CompanyParam;
import com.wnx.job.modules.jms.model.JmsCompany;
import com.wnx.job.modules.jms.service.JmsCompanyService;
import com.wnx.job.modules.pms.service.PmsEmailService;
import com.wnx.job.modules.ums.service.UmsAdminService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.security.Principal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 企业 前端控制器
 * </p>
 *
 * @author wangnaixing
 * @since 2021-12-17
 */
@Slf4j
@RestController
@RequestMapping("/jms/jmsCompany")
@Api(tags = "CompanyController",description = "企业管理")
public class JmsCompanyController {
    @Resource
    private JmsCompanyService companyService;
    @Resource
    private PmsEmailService emailService;
    @Resource
    private UmsAdminService adminService;
    @Resource
    private AsyncTask asyncTask;
    /**
     * 新增企业
     * @param companyParam
     * @return
     */
    @PostMapping("/save")
    @ApiOperation("新增企业")
    public ResultData<String> save(@RequestBody @Validated CompanyParam companyParam){
        log.info("【=======系统正在增加企业中，该企业的信息为：============】");
        JmsCompany tbCompany = CompanyMapper.INSTANCE.toPojo(companyParam);
        companyService.saveCompany(tbCompany);
        log.info("【==========系统新增企业成功！=============】");
        return ResultData.success(Const.ADD_COMPANY_SUCCESS);

    }

    /**
     * 删除企业
     * @param id
     * @return
     */
    @GetMapping("/delete/{id}")
    @ApiOperation("删除企业")
    public ResultData<String> deleteCompany(@PathVariable(name = "id") Long id){
        log.info("【=========系统正在删除企业，删除企业ID为：{}=======】",id);
        companyService.deleteCompany(id);
        log.info("【============系统删除企业成功！！===========】");
        return ResultData.success(Const.DELETE_COMPANY_SUCCESS);
    }

    /**
     * 修改企业
     * @param companyParam
     * @return
     */
    @PostMapping("/update")
    @ApiOperation("修改企业")
    public ResultData<String> update(@RequestBody @Validated CompanyParam companyParam){
        log.info("【=======系统正在修改企业中，该企业的信息为：============】");
        JmsCompany tbCompany = CompanyMapper.INSTANCE.toPojo(companyParam);
        tbCompany.setUpdated(new Date());
        companyService.updateById(tbCompany);
        log.info("【============系统修改企业成功！！===========】");
        return ResultData.success(Const.UPDATE_COMPANY_SUCCESS);
    }

    /**
     * 根据ID查询企业
     */
    @GetMapping("/findById/{id}")
    @ApiOperation("根据ID查询企业")
    public ResultData<JmsCompany> findById(@PathVariable(name = "id")Long id){
        log.info("【=======系统正在根据ID查询企业中....============】");
        JmsCompany company = companyService.getById(id);
        log.info("【=======系统正在根据ID查询企业成功,该企业的信息为：{}============】",company);
        return ResultData.success(Const.QUERY_COMPANY_SUCCESS,company);
    }

    /**
     * 分页查询
     * @param queryPageBean
     * @return
     */
    @PostMapping("/findByPage")
    @ApiOperation("分页查询")
    public ResultData<PageResult<JmsCompany>> findByPage(@RequestBody QueryPageBean queryPageBean){
        log.info("【==========系统正在分页查询企业信息，前端分页查询数据为{}：=============】",queryPageBean);
        PageResult<JmsCompany> pageResult = companyService.findByPage(queryPageBean);
        log.info("【==========系统正在分页查询企业信息成功！，后端返回的分页查询数据为=============】");
        return ResultData.success(Const.QUERY_COMPANY_SUCCESS,pageResult);
    }

    /**
     * 查询全部注册企业
     * @return
     */
    @GetMapping("/findAll")
    @ApiOperation("查询全部注册企业")
    public ResultData<List<JmsCompany>> findAllByStatusIsEq1(){
        log.info("【==========系统正在分页查询查询全部注册企业成功！=============】");
        List<JmsCompany> companyList =  companyService.list(new QueryWrapper<JmsCompany>().lambda()
                .eq(JmsCompany::getStatus,Const.COMPANY_REVIEWED));
        log.info("【==========系统正在分页查询查询全部注册企业：===========】");
        return ResultData.success(Const.QUERY_COMPANY_SUCCESS,companyList);
    }

    /**
     * 批量删除企业
     * @return
     */
    @PostMapping("/deleteByBatch")
    @ApiOperation("批量删除企业驻校")
    public ResultData<String> deleteByBatch(@RequestBody Long[] ids){
        log.info("【=====系统正在进行企业批量删除中========】");
        for (Long id : ids) {companyService.deleteCompany(id);}
        log.info("【=====系统正在进行企业批量删除成功！！！========】");
        return ResultData.success(Const.DELETE_COMPANY_SUCCESS);
    }


    /**
     * 企业审核通过
     * @return
     */
    @GetMapping("/checkPass/{id}")
    @ApiOperation("企业审核通过")
    public ResultData<String> checkPass(@PathVariable(name = "id")Long id,Principal principal){
        log.info("【=====系统正在进行企业审核通过中========】");
        JmsCompany company = companyService.getById(id);
        companyService.checkPass(company);
        //执行异步任务，发送邮件
        asyncTask.updateEmailStatus(company);
        asyncTask.sendEmail(company,principal);
        log.info("【=====系统正在进行企业审核成功中========】");
        //返回结果集对象
        return ResultData.success(Const.CHECK_PASS_COMPANY_SUCCESS);

    }


    /**
     * 企业审核不通过
     * @return
     */
    @GetMapping("/checkRefuse/{id}")
    @ApiOperation("企业审核不通过")
    public ResultData<String> checkRefuse(@PathVariable(name = "id")Long id){
        log.info("【=====系统正在进行企业审核拒绝中========】");
        //获取企业ID
        //调用服务，根据ID查询企业信息。
        JmsCompany company = companyService.getById(id);
        //调用服务，进行企业审核不通过
        companyService.checkRefuse(company);
        log.info("【=====系统正在进行企业审核拒绝成功！！！！-======】");
        return ResultData.success(Const.CHECK_REJECT_COMPANY_SUCCESS);

    }








    /**
     * 获取公司信息列表
     * @param queryPageBean
     * @return
     */
    @PostMapping("/getCompanyList")
    @ApiOperation("(网站前台)获取公司信息列表")
    public ResultData<PageResult<JmsCompany>> getCompanyList(@RequestBody QueryPageBean queryPageBean){
        log.info("（网站前台）系统正在获取公式信息列表");
        //设置查询条件必须是审核通过的公司
        Map<String,Object> queryParams = queryPageBean.getQueryParams();
        queryParams.put("status", Const.COMPANY_REVIEWED);
        queryPageBean.setQueryParams(queryParams);
        //调用服务层，查询公司信息集合
        PageResult<JmsCompany> pageResult = companyService.findByPage(queryPageBean);

        log.info("（网站前台）系统获取公式信息列表成功");
        return ResultData.success(Const.QUERY_COMPANY_SUCCESS,pageResult);

    }

    /**
     * 根据企业ID查询企业详情
     * @param id
     * @return
     */
    @GetMapping("/getCompanyDetail/{id}")
    @ApiOperation("(网站前台)根据企业ID查询企业详情")
    public ResultData<CompanyParam> findDetailById(@PathVariable(name = "id")Long id){
        log.info("========(网站前台)系统正在根据企业ID查询企业详情中============");
        //调用服务层，根据公司ID查询公司详情
        CompanyParam company  =  companyService.findDetailById(id);

        log.info("========(网站前台)系统正在根据企业ID查询企业详情成功！============");
        return ResultData.success(Const.QUERY_COMPANY_SUCCESS,company);

    }
    /**
     * 公司提交注册申请
     * @param companyParam
     * @return
     */
    @PostMapping("/registerCompany")
    @ApiOperation("(网站前台)公司提交注册申请")
    public ResultData<String> registerCompany(@RequestBody @Validated CompanyParam companyParam){
        log.info("（网站前台）系统正在处理公司提交的注册申请！");
        JmsCompany tbCompany = CompanyMapper.INSTANCE.toPojo(companyParam);
        companyService.save(tbCompany);
        log.info("（网站前台）系统正在处理公司提交的注册申请！成功");
        return ResultData.success(Const.ADD_COMPANY_SUCCESS);
    }

    /**
     * 获取公司账户信息
     * @return
     */
    @GetMapping("/getCompanyInfo")
    @ApiOperation("获取公司账户信息")
    public ResultData<JmsCompany> getCompanyInfo(Principal principal) {
        log.info("=========系统正在进行查询公司信息中==============");
        //通过认证主体，获取公司账号。
        String username = principal.getName();
        //调用服务层，根据公司名称获取公司信息
        JmsCompany company =  companyService.findByUsername(username);
        //返回结果对象
        log.info("=========系统正在进行查询公司信息成功！！！！==============");
        return ResultData.success(Const.QUERY_COMPANY_SUCCESS,company);

    }


    /**
     * 修改企业信息
     * @return
     */
    @PostMapping("/updateCompanyInfo")
    @ApiOperation("修改企业信息")
    public ResultData<JmsCompany> updateCompanyInfo(@RequestBody @Validated CompanyInfoParam companyDto ){
        //获取前端的公司部分Dto


        //调用服务层，根据ID查询数据库企业信息
        JmsCompany companyByDb = companyService.getById(companyDto.getId());

        //Dto属性赋值给企业信息
        companyByDb.setTelephone(companyDto.getTelephone());
        companyByDb.setEmail(companyDto.getEmail());
        companyByDb.setAddr(companyDto.getAddr());
        companyByDb.setUrl(companyDto.getUrl());
        companyByDb.setSize(companyDto.getSize());
        companyByDb.setLogo(companyDto.getLogo());
        companyByDb.setDescription(companyDto.getDescription());



        //调用服务层，进行修改公司部分信息
        companyService.updateById(companyByDb);

        //返回结果对象
        return ResultData.success(Const.UPDATE_COMPANY_SUCCESS,companyByDb);

    }


}

